﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;

namespace SoftHotel.Models
{
    public class DetallePromocionDAO
    {
        private Conexion conexionBD = new Conexion();



        public List<DetallePromocion> ejecutar_query(int id)
        {

            string consulta = "";
            conexionBD.AbrirConexion();
            List<DetallePromocion> detPromociones = new List<DetallePromocion>();

            consulta = "select idDetallePromocion, idPromocion, idCliente, idreserva,total, descripcion, moneda from DETALLEPROMOCION where IDPROMOCION=" + id;

            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);

            while (dataReader != null && dataReader.Read())
            {
                DetallePromocion detalle = new DetallePromocion();
                detalle.idDetallePromocion = dataReader.GetInt32(0);
                detalle.idPromocion = dataReader.GetInt32(1);
                detalle.idCliente = dataReader.GetInt32(2);
                detalle.idReserva = dataReader.GetInt32(3);
                
                if (!dataReader.IsDBNull(4)) detalle.total = dataReader.GetDecimal(4);
                if (!dataReader.IsDBNull(5))  detalle.descripcion = dataReader[5].ToString();
                detalle.moneda = dataReader.GetInt32(6);


                //queda pendiente lo de sede

                detPromociones.Add(detalle);
               

            }

            conexionBD.CerrarConexion();
            return detPromociones;
        }

        public void add_detalle(DetallePromocion detalle)
        {

            string consulta = "";
            conexionBD.AbrirConexion();

            consulta = "INSERT INTO DETALLEPROMOCION (IDPROMOCION, IDRESERVA, IDCLIENTE, TOTAL, DESCRIPCION, MONEDA  )" +
                        "VALUES (@idpromo, @idreserva,@idcliente,@total,@descp, @moneda )";

            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta;

            command.Parameters.Add("@idpromo", SqlDbType.Int).Value = detalle.idPromocion;
            command.Parameters.Add("@idreserva", SqlDbType.Int).Value = detalle.idReserva;
            command.Parameters.Add("@idcliente", SqlDbType.Int).Value = detalle.idCliente;
            command.Parameters.Add("@descp", SqlDbType.Char, 50).Value = detalle.descripcion;

            command.Parameters.Add("@total", SqlDbType.Decimal).Value = detalle.total;
            command.Parameters.Add("@moneda", SqlDbType.Int).Value = 1;

            conexionBD.EjecutarComando2(command);
            


        }


        //Se pasa como parametro el id del cliente, se llama cuando se crea nueva reserva
        public void generar_promo(int idcliente, int idreserva)
        {
            
            //promocion invitado especial
            List<Int32> listapromosinv = new List<Int32>();
            listapromosinv = promo_activa(0);
            foreach (Int32 idpromo in listapromosinv) 
            {
                if (buscar_cliente_evento_activo(idcliente)) {

                    DetallePromocion detalle = new DetallePromocion();
                    detalle.idCliente = idcliente;
                    detalle.idPromocion = idpromo;
                    detalle.idReserva = idreserva;
                    detalle.descripcion = "DESCUENTO PROMOCION INVITADO";
                    detalle.total = buscar_descuento(idpromo);
                    add_detalle(detalle);
                }
            }

            //promocion numero de dias
            List<Int32> listapromosdias = new List<Int32>();
            listapromosdias = promo_activa(1);
            foreach (Int32 idpromo in listapromosdias)
            {
                int diasPromo=promo_numdias(idpromo);
                int diasReserva = reserva_numdias(idreserva);
                if (diasReserva>=diasPromo)
                {

                    DetallePromocion detalle = new DetallePromocion();
                    detalle.idCliente = idcliente;
                    detalle.idPromocion = idpromo;
                    detalle.idReserva = idreserva;
                    detalle.descripcion = "DESCUENTO PROMOCION NUMERO DE DIAS";
                    detalle.total = buscar_descuento(idpromo);
                    add_detalle(detalle);
                }
            }





        }


        public int promo_numdias(int id)
        {
            string consulta = "";
            conexionBD.AbrirConexion();


            consulta = "select cantidadDias from PROMOCION where IDPROMOCION=" + id;

            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);
            dataReader.Read();

            if (dataReader.HasRows) return (dataReader.GetInt32(0));
            else return 0;



        }

        public int reserva_numdias(int id)
        {
            string consulta = "";
            conexionBD.AbrirConexion();

            //AQUI BUSCAR NUMERO DE DIAS DE LA RESERVA
            consulta = "select cantidadDias from PROMOCION where IDPROMOCION=" + id;

            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);
            dataReader.Read();


            if (dataReader.HasRows) return (dataReader.GetInt32(0));
            else return 0;

        }



        
        
        
        public Decimal buscar_descuento(int id){
            string consulta = "";
            conexionBD.AbrirConexion();


            consulta = "select descuento from PROMOCION where IDPROMOCION="+id;

            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);
            dataReader.Read();


            return (dataReader.GetDecimal(0));

            
        }

        public bool reserva_activa(int id, int idpromo)
        {
            string consulta1 = "";

            conexionBD.AbrirConexion();
            consulta1 = "SELECT reserva.IDRESERVA FROM Reserva, Promocion WHERE Reserva.idReserva = @id AND Promocion.idpromocion = @idpromo AND Reserva.fechacreacion BETWEEN promocion.FECHAINICIO AND promocion.FECHAFIN";


            SqlDataReader dataReader1 = null;
            conexionBD.AbrirConexion();
            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta1;
            command.Parameters.Add("@id", SqlDbType.Int).Value = id;
            command.Parameters.Add("@idpromo", SqlDbType.Int).Value = idpromo;
            dataReader1 = command.ExecuteReader();

            dataReader1.Read();
            
            return (dataReader1.HasRows);
        }

        public Decimal buscar_monto(int id)
        {
            string consulta1 = "";

            conexionBD.AbrirConexion();
            consulta1 = "SELECT total FROM Reserva WHERE Reserva.idReserva = @id";
            SqlDataReader dataReader1 = null;
            conexionBD.AbrirConexion();
            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta1;
            command.Parameters.Add("@id", SqlDbType.Int).Value = id;
            dataReader1 = command.ExecuteReader();

            dataReader1.Read();
            Decimal total;
            if (dataReader1.IsDBNull(0)) total = 0;
            else total = dataReader1.GetDecimal(0);

            return total;
        }

        public List<Int32> promo_activa(int tipo)
        {
            List<Int32> listapromos = new List<Int32>();
            string consulta = "";
            conexionBD.AbrirConexion();


            consulta = "select idPromocion from PROMOCION where TIPO=" + tipo + " AND ESTADO=1  AND SYSDATETIME() BETWEEN FECHAINICIO AND FECHAFIN ";

            SqlDataReader dataReader = conexionBD.EjecutarReader(consulta);
      
            while (dataReader != null && dataReader.Read()) listapromos.Add(dataReader.GetInt32(0));
            
            return listapromos;
        }

        public bool buscar_cliente_evento_activo(int id)
        {
            
            //busq cliente
            string consulta1 = "";
            consulta1 = "SELECT TIPODOC, NUMDOC FROM CLIENTE WHERE IDCLIENTE =" + id;


            SqlDataReader dataReader1 = conexionBD.EjecutarReader(consulta1);
            dataReader1.Read();

            Int32 tipoDocumento = dataReader1.GetInt32(0);
            String numdoc = dataReader1[1].ToString();


            //encuentra el evento(s) al cual esta invitado
            string consulta = "";
            consulta = "SELECT idreserva FROM INVITADO WHERE  TIPODOC= @tipo  AND NUMDOC = @num";



            SqlDataReader dataReader = null;
            conexionBD.AbrirConexion();
            SqlCommand command = conexionBD.connection.CreateCommand();
            command.CommandText = consulta;
            command.Parameters.Add("@tipo", SqlDbType.Int).Value = tipoDocumento;

            command.Parameters.Add("@num", SqlDbType.Char, 20).Value = numdoc;
           
            dataReader = command.ExecuteReader();

            while (dataReader != null && dataReader.Read()) {
                //valida que los eventos a los que esta invitado esten activos -> no finalizados, no anualdos
                Int32 idreserva = dataReader.GetInt32(0);

                
                string consulta2 = "SELECT idreserva from RESERVA WHERE IDRESERVA="+ idreserva + " AND ESTADO <> 3  AND ESTADO <> 4";

                SqlDataReader dataReader2 = conexionBD.EjecutarReader(consulta2);
                if (dataReader2.HasRows) return true;


            }

            return false;
        }
         
    }
}